/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Clases;

import Persistencia.PersistenciaFactura;
import Persistencia.PersistenciaSFacturacion;
import com.mysql.jdbc.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;

/**
 *
 * @author Jerónimo Trigueros Vera
 */
public class Factura {
    //ArrayList<Factura> facturas = PersistenciaFactura.obtenerFacturas();
    SFacturacion serieFacturacion;
    FacturacionCliente facturacionCliente;
    private Date fecha;
    private float retencion;
    private boolean enviado;
    TiposIva tipoIva;
    private float totalBaseImponible;
    private float totalFactura;
    private String codigo;
    ArrayList<LineaServicioFactura> lineas = new ArrayList();


    public float getTotalBaseImponible() {
        return totalBaseImponible;
    }

    public void setTotalBaseImponible(float totalBaseImponible) {
        this.totalBaseImponible = totalBaseImponible;
    }
    
    
    public Factura(SFacturacion serieFacturacion, FacturacionCliente facturacionCliente, Date fecha, TiposIva tipoIva, float retencion,ArrayList<LineaServicioFactura> lineas) throws SQLException
    {
        this.fecha = fecha;
        this.tipoIva = tipoIva;
        this.retencion = retencion;
        this.enviado = false;
        this.serieFacturacion = serieFacturacion;
        this.facturacionCliente = facturacionCliente;
        this.lineas = lineas; 

        if(!lineas.isEmpty())
        {
            this.totalBaseImponible = this.calcularTotalBaseImponible();            
            this.totalFactura = this.calcularTotal();   
        }
        else{
            this.totalBaseImponible = 0;
            this.totalFactura = 0;
        }

        //incrementa en la bd el valor de codigo para esta serie
        int incrementado = PersistenciaSFacturacion.incrementarCodigo(serieFacturacion);                  
        //guardamos el valor de este codigo de la bd en el codigo de esta factura
        this.codigo = PersistenciaSFacturacion.obtenerCodigo(serieFacturacion);
        

        
        
        
        
    
        
        
    }
    
    public Factura(FacturacionCliente facturacionCliente, SFacturacion serieFacturacion, String codigoFactura, Date fechaF, TiposIva tipoIVA, float retencionF,ArrayList<LineaServicioFactura> lineas, boolean enviado){
     this.facturacionCliente = facturacionCliente;
     this.serieFacturacion = serieFacturacion;
     this.codigo = codigoFactura;
     this.fecha = fechaF;
     this.tipoIva = tipoIVA;
     this.retencion = retencionF;
     this.lineas = lineas;
     this.enviado = enviado;
        this.lineas = lineas; 

        if(!lineas.isEmpty())
        {
            this.totalBaseImponible = this.calcularTotalBaseImponible();            
            this.totalFactura = this.calcularTotal();   
        }
        else{
            this.totalBaseImponible = 0;
            this.totalFactura = 0;
        }     
     
    }
      
    
    public Factura() {
    }    
    




    public boolean isEnviado() {
        return enviado;
    }

    public void setEnviado(boolean enviado) {
        this.enviado = enviado;
    }
    
    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }    

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public TiposIva getTipoIva() {
        return tipoIva;
    }

    public void setTipoIva(TiposIva tipoIva) {
        this.tipoIva = tipoIva;
    }



    public float getRetencion() {
        return retencion;
    }

    public void setRetencion(float retencion) {
        this.retencion = retencion;
    }

    public float getTotalFactura() {
        return totalFactura;
    }

    public void setTotalFactura(float totalFactura) {
        this.totalFactura = totalFactura;
    }
    
    @Override
    public boolean equals(Object o){
        boolean ret = false;
        if(o instanceof Factura){
            Factura fac = (Factura) o;
            if(fac.getSerieFacturacion().equals(this.getSerieFacturacion())){
                ret = true;
            }
        }
        return ret;
    }

    @Override
    public int hashCode() {
        return 0;
    }

    public FacturacionCliente getFacturacionCliente() {
        return facturacionCliente;
    }

    public void setFacturacionCliente(FacturacionCliente facturacionCliente) {
        this.facturacionCliente = facturacionCliente;
    }




    public SFacturacion getSerieFacturacion() {
        return serieFacturacion;
    }

    public void setSerieFacturacion(SFacturacion sf) {
        this.serieFacturacion = sf;
    }
    
    //el toString de factura me devolverá el nombre del cliente y la serie de facturación
    @Override
    public String toString()
    {
        return this.getSerieFacturacion().toString() + this.getFacturacionCliente().toString();
    }
    
    private float calcularTotalBaseImponible()
    {
        float totalF=0;
        for(LineaServicioFactura linea:lineas)
        {
            totalF += linea.getTotalLinea();
        }
        return totalF;
    }

    public ArrayList<LineaServicioFactura> getLineas() {
        return lineas;
    }

    public void setLineas(ArrayList<LineaServicioFactura> lineas) {
        this.lineas = lineas;
    }


    
    private float calcularTotal()
    {
        float total = 0f;
        float baseConIVA = 0f;
        float calculoPorcentajeIVA = 0f;
        float calculoPorcentajeRetencion = 0f;
        
        calculoPorcentajeIVA = this.calcularTotalBaseImponible()*this.getTipoIva().getPorcentaje()/100;
        baseConIVA = this.calcularTotalBaseImponible() + calculoPorcentajeIVA;
        calculoPorcentajeRetencion = this.calcularTotalBaseImponible()*this.getRetencion()/100;
        total = baseConIVA - calculoPorcentajeRetencion;
        return total;
        
    }
    

    
}
